package dao;

import connection.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.ChamadoDet;

/**
 * Define as propriedades da classe de detalhes de chamado;
 * @author Janio Luiz Antunes
 * @author Marcel Vinicius Kohls
 * @see http://code.google.com/p/sysdesk-java/
 *
 */
public class DAOChamadoDet {
     private final String SQL_LISTA_DETALHES = "select det_codigo, to_char(a.det_data, 'DD/MM/YYYY') as det_data, to_char(a.det_hora, 'HH24:MI:SS') as det_hora, a.det_descricao, b.ope_nome from det_chamados a, operadores b where det_ope_codigo = ope_codigo and det_cab_codigo = ? order by det_codigo";
     private final String SQL_INCLUIR_CHAMADO_DET = "INSERT INTO det_chamados (det_cab_codigo, det_ope_codigo, det_descricao, det_data, det_hora) VALUES (?,?,?,current_date, current_time)";
     private final String SQL_ALTERAR_CHAMADO_DET = "UPDATE det_chamados set det_ope_codigo=?, det_descricao=? where det_codigo=?";
     private final String SQL_LISTA_CHAMADO_POR_CODIGO = "select a.det_codigo, a.det_cab_codigo, a.det_ope_codigo, to_char(a.det_data, 'DD/MM/YYYY') as det_data, to_char(a.det_hora, 'HH24:MI:SS') as det_hora, a.det_descricao, b.ope_nome from det_chamados a, operadores b where det_ope_codigo = ope_codigo and det_codigo = ? order by det_codigo";

     
     /**
     * Retorna um resultSet com o resultado do comando de sql da lista dos detalhes de chamado
     * @return
     * @throws Exception
     */
     public ResultSet getListaChamadoDet(int pCodCabecalho) throws Exception {
         PreparedStatement sqlQuery = null;
         ResultSet sqlResult = null;

        try {
            sqlQuery = Conexao.getConnection().prepareStatement(SQL_LISTA_DETALHES);
            sqlQuery.setInt(1, pCodCabecalho);
            sqlResult = Conexao.getStatement().executeQuery(sqlQuery.toString());
            return sqlResult;

        }catch(SQLException sqle){
            System.out.println("Erro:getListaChamadoDet:"+sqle.getMessage());
            throw new Exception(sqle);
        } catch(Exception e){
            System.out.println("Erro:getChamadoDetPorCodigo:"+e.getMessage());
            throw new Exception(e);
        } finally{}
    }

    /**
     * Salva uma instância de detalhe de chamado no banco. Se tiver código então é uma alteração,
     * se o código for null, então é inclusão.
     * @param pChamadoDet
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public Boolean salvar(ChamadoDet pChamadoDet, int pCodChamado) throws Exception {
        PreparedStatement sqlQuery = null;
        Boolean resultado = false;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pChamadoDet.getCodigo() != 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_ALTERAR_CHAMADO_DET);

                sqlQuery.setInt(1, pChamadoDet.getCodOperador());
                sqlQuery.setString(2, pChamadoDet.getDescricao());
                sqlQuery.setInt(3, pChamadoDet.getCodigo());

                System.out.println("DAOChamadoDet.Salvar(Alterar):");
                System.out.println(sqlQuery.toString());
            }
            // prepara SQL para incluir
            else {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_INCLUIR_CHAMADO_DET);

                sqlQuery.setInt(1, pCodChamado);
                sqlQuery.setInt(2, pChamadoDet.getCodOperador());
                sqlQuery.setString(3, pChamadoDet.getDescricao());

                System.out.println("DAOChamadoDet.Salvar(Incluir):");
                System.out.println(sqlQuery.toString());
            }

            sqlQuery.executeUpdate();

            resultado = true;
        }catch(SQLException sqle){
            System.out.println("Erro:DAOChamadoDet.Salvar:"+sqle.getMessage());
            throw new Exception(sqle);
        } catch(Exception e){
            System.out.println("Erro:DAOChamadoDet.Salvar:"+e.getMessage());
            throw new Exception(e);
        } finally{}

      return resultado;
    }

    /**
     * retorna uma instancia de detalhe de chamado a partir de uma busca no sql
     * pelo código passado como parametro.
     * @param pCodChamadoDet
     * @return
     * @throws Exception
     */
    public ChamadoDet getChamadoDetPorCodigo(int pCodChamadoDet) throws Exception {
        PreparedStatement sqlQuery = null;
        ResultSet sqlResult = null;
        ChamadoDet resultadoChamado = new ChamadoDet();

        try {
            sqlQuery  = Conexao.getConnection().prepareStatement(SQL_LISTA_CHAMADO_POR_CODIGO);
            sqlQuery.setInt(1,  pCodChamadoDet );
            System.out.println( sqlQuery.toString() );
            sqlResult = sqlQuery.executeQuery();

            resultadoChamado = getValorDoResultado(sqlResult);

            return resultadoChamado;
        }catch(SQLException sqle){
            System.out.println("Erro:getChamadoDetPorCodigo:"+sqle.getMessage());
            throw new Exception(sqle);
        } catch(Exception e){
            System.out.println("Erro:getChamadoDetPorCodigo:"+e.getMessage());
            throw new Exception(e);
        } finally{}
    }

    /**
     * monta um objeto do tipo detalhe chamado, baseado em um retorno de pesquisa de sql em detalhe de chamados
     * @param pSqlResult
     * @return
     */
    public ChamadoDet getValorDoResultado(ResultSet pSqlResult) throws Exception {
        ChamadoDet objetoRetorno = new ChamadoDet();

        try {

            // apenas define os campos do objeto se realmente retornou resultado
            if (pSqlResult.next()){
                objetoRetorno.setCodigo(pSqlResult.getInt("det_codigo"));
                objetoRetorno.setCodChamado(pSqlResult.getInt("det_cab_codigo"));
                objetoRetorno.setCodOperador(pSqlResult.getInt("det_ope_codigo"));
                objetoRetorno.setNomeOperador(pSqlResult.getString("ope_nome"));
                objetoRetorno.setDescricao(pSqlResult.getString("det_descricao"));
//                objetoRetorno.setDataRegistro(pSqlResult.getDate("det_data"));
//                objetoRetorno.setHoraRegistro(pSqlResult.getTime("det_hora"));
            }

        } catch (Exception e) {
            System.out.println("erro: getValorDoResultado: "+e.getMessage());
        }

        return objetoRetorno;
    }


}
